package com.ydl.shopping.async;

import com.ydl.shopping.core.entity.TaskInfo;
import com.ydl.shopping.core.enums.TaskStatusEnum;
import com.ydl.shopping.thread.AsyncTaskManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.function.Consumer;
import java.util.function.Function;

@Component
@Slf4j
public class AsyncTaskService {
    @Resource
    private AsyncTaskManager asyncTaskManager;

    /**
     * 异步执行函数
     *
     * @param consumer 需要执行函数
     * @param serviceName 业务名称
     * @return 任务信息
     */
    public TaskInfo execute(Consumer<?> consumer, String serviceName) {
        log.info("异步任务执行 [{}]", serviceName);
        return asyncTaskManager.submit(() -> consumer.accept(null));
    }

    /**
     * 异步执行函数
     *
     * @param function 需要执行函数
     * @param param 参数
     * @param serviceName 业务名称
     * @param <T> 参数类型
     * @param <R> 返回值类型
     * @return 任务信息
     */
    public <T, R> TaskInfo execute(Function<T, R> function, T param, String serviceName) {
        log.info("异步任务执行 [{}]", serviceName);
        return asyncTaskManager.submit(() -> {
            function.apply(param);
        });
    }

    /**
     * 获取异步任务状态
     *
     * @param taskId 异步任务ID
     * @return 异步任务状态
     */
    public TaskStatusEnum getTaskStatus(String taskId) {
        return asyncTaskManager.getTaskStatus(taskId);
    }
}
